﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
using System.ComponentModel;
using System.Diagnostics;
using VisionEstereo.SegmentacionColores; // cronómetro

namespace VisionEstereo
{
	// Clase privada para representar los argumentos del algoritmo
	class ArgsImagenes2
	{
		public Bitmap bitmapImagen;
		// Los parámetros
		public Object parametros;

        public ArgsImagenes2(Bitmap bitmap, Object parametros)
		{
			this.bitmapImagen = bitmap;
			this.parametros = parametros;
		}
		
		public Object Parametros
		{
			get
			{
				return parametros;
			}
			set
			{
				this.parametros = value;
			}
		}
	}
	
    public partial class SeleccionImagen
    {
		// Atributos (imágenes)
		private Bitmap bitmapImagen;
			
		// Atributos (tipo de algoritmo)
		private App.TipoAlgoritmo tipoAlgoritmo;
		
		// Atributos (parámetros del algoritmo)
		private Object parametrosAlgoritmo;

        //Umbral
        private int umbral;

        private bool aleatorios;

        //Atributos para el Esquema del Algoritmo de Correlación
        private Boolean es_esquemaCorrelacion;
        private VisionEstereo.AlgoritmoCorrelacion.EsquemaCorrelacion esquemaCorrelacion;
		
        public SeleccionImagen()
        {
            this.InitializeComponent();

            // Insert code required on object creation below this point.
        }
        public void setEsquemaAlg(VisionEstereo.AlgoritmoCorrelacion.EsquemaCorrelacion esquemaCorrelacion)
        {
            //Esquema del Algoritmo de Correlación
            es_esquemaCorrelacion = true;
            this.esquemaCorrelacion = esquemaCorrelacion;

        }  
		
		public SeleccionImagen(App.TipoAlgoritmo tipoAlgoritmo, Object parametrosAlgoritmo)
		{
			this.InitializeComponent();
			this.tipoAlgoritmo = tipoAlgoritmo;
			this.parametrosAlgoritmo = parametrosAlgoritmo;
		}

        private void cargarImagen_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            // Abrimos un cuadro de diálogo
            OpenFileDialog dialogoAbrir = new OpenFileDialog();
            dialogoAbrir.Filter = "Archivos de imagen|*.jpg;*.png;*.bmp";
            dialogoAbrir.Title = "Seleccione la imagen";
			
            if (dialogoAbrir.ShowDialog() == DialogResult.OK)
            {
				bitmapImagen = new Bitmap(dialogoAbrir.FileName);
				this.imagen.Fill = new ImageBrush(new BitmapImage(new Uri(dialogoAbrir.FileName)));
                
             
            }
        }

        private void botonSiguiente_Click(object sender, System.Windows.RoutedEventArgs e)
        {
        	// Validamos que el usuario haya cargado las dos imágenes
            if (this.imagen.Fill.Equals(System.Windows.Media.Brushes.White))
            {
                MensajeError error = new MensajeError();
                error.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                error.setMensajeError("Debe seleccionar una imagen antes de continuar.");
                error.ShowDialog();
            }
            else if (Int32.Parse(textUmbral.Text)==0)
            {
                MensajeError error = new MensajeError();
                error.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                error.setMensajeError("Debe elegir un valor para el umbral distinto de cero");
                error.ShowDialog();
            }
            else
            {                
                umbral = Int32.Parse(textUmbral.Text);              
                                
                VisionEstereo.SegmentacionColores.AlgCuantizacionVectorial Colores=new  VisionEstereo.SegmentacionColores.AlgCuantizacionVectorial();

               
                //----- Cronómetro----//
                Stopwatch clock = new Stopwatch();
                clock.Reset();
                clock.Start();

                if (aleatoriosCheckBox.IsChecked == true)
                    aleatorios = true;
                    
                else
                    aleatorios = false;
                
                Bitmap Result = Colores.EjecutarAlgCuantizacionVectorial(bitmapImagen, umbral, aleatorios);
                
                System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(Result.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
               
                clock.Stop();



                if (es_esquemaCorrelacion)
                {
                        /*Se trata del Esquema del Algoritmo de Correlación*/
                        esquemaCorrelacion.setMapaSegmentacion(Colores.dameMatrizClases(),Result);
                        esquemaCorrelacion.setImagenClases(bitmapSource);
                        this.NavigationService.Navigate(esquemaCorrelacion);
                }
                else
                {               
                    ResultadosSegmentacion paginaResult = new ResultadosSegmentacion();                    
                    paginaResult.setImagenResultado(bitmapSource);
                    paginaResult.setImagenInicial(bitmapImagen);

                    //---Segmentación de colores----///
                    paginaResult.setSegmentacionColores(true);
                    paginaResult.setImagenClases(Colores.dameMatrizClases());
                    paginaResult.setNumeroClases(Colores.dameNumeroClases());
                    paginaResult.setTamañoImagenReal(bitmapImagen.Size.Width, bitmapImagen.Size.Height);
                

                    paginaResult.setListaClases(Colores.dameListaClases());
                    paginaResult.setColoresClases(Result); //result bitmap ----------------

                    //---- Tiempo -------------------------------/                
                    //Recoge el tiempo transcurrido como un valor TimeSpan.
                     TimeSpan ts = clock.Elapsed;
                    //Da formato para mostrar el valor TimeSpan.
                     String tiempo = String.Format("{0:00}h {1:00}´ {2:00}´´ {3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);                 
                    paginaResult.setTiempo(tiempo);
                
                    //-------------------------------------------///
                    this.NavigationService.Navigate(paginaResult);
                 }
            }
		}

	}
}